//! Pre-startup OS-a, sredim neke stvari prije nego idem na "visu" razinu

#define _ARH_POCETAK_C_
#include "postavke.h"

#include <jezgra/postavke.h>

/*!
 * Funkcija koja je pozvana odmah iz asemblerskog koda kod samog pocetka
 * bootanja.
 * \param magic Bootloader magic number
 * \param addr Adresa multiboot_info_t strukture
 */
void arh_pocetak (unsigned long magic, unsigned long addr)
{
	gdt_inicijalizacija();
	
	j_pocetak(magic, addr); //predajemo kontrolu jezgri
}

static gdt_t gdt[] = {GDT_0, GDT_CODE, GDT_DATA};

static void gdt_inicijalizacija ()
{
	gdtr_t gdtr;
	gdtr.gdt = gdt;
	gdtr.limit = sizeof(gdt) - 1;
	
	//postavi tablicu u registar
	__asm__ ("lgdt	%0\n\t" :: "m" (gdtr) );
		
	//azuriraj segmentne registre sa:
	//0x08 za kod (1. zapis gdt-a, 0. preskacem)
	//0x10 za podatke (2. zapis gdt-a)

	__asm__ __volatile__ (
			"ljmp	$0x08, $1f	\n"	//azuriraj "cs"
		"1:				\n\t"
			"pushl	%eax		\n\t"
			"movl	$0x0010, %eax	\n\t"
			"mov	%ax, %ds	\n\t"
			"mov	%ax, %es	\n\t"
			"mov	%ax, %fs	\n\t"
			"mov	%ax, %gs	\n\t"
			"mov	%ax, %ss	\n\t"
			"popl	%eax		\n\t"
		);
}
